﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using General;

namespace TVLL5A
{
    public class AventuraL5A
    {
        private List<PersonajeL5A> _lpers;
        private List<SituacionL5A> _lsits;
        private string _fallo;
        private const string _rutaxsd = "../../../TVLL5A/AventuraL5A.xsd";
        private string _nombre;
        private string _desc;
        private string _master;

        public List<PersonajeL5A> ListaPersonajes
        {
            get { return this._lpers; }
            set { this._lpers = value; }
        }

        public List<SituacionL5A> ListaSituaciones
        {
            get { return this._lsits; }
            set { this._lsits = value; }
        }

        public string Nombre
        {
            get { return this._nombre; }
            set { this._nombre = value; }
        }

        public string Descripcion
        {
            get { return this._desc; }
            set { this._desc = value; }
        }

        public string Master
        {
            get { return this._master; }
            set { this._master = value; }
        }

        public string Fallo
        {
            get { return this._fallo; }
        }

        public AventuraL5A()
        {
            this._lpers = new List<PersonajeL5A>();
            this._lsits = new List<SituacionL5A>();
            _fallo = "No";
        }

        public AventuraL5A(string nombre, string descripcion, List<PersonajeL5A> Lpersonajes, List<SituacionL5A> Lsituaciones)
        {
            this._nombre = nombre;
            this._desc = descripcion;
            this._lpers = Lpersonajes;
            this._lsits = Lsituaciones;
            _fallo = "No";
        }

        private void toXTVL(XmlTextWriter mixml)
        {
            mixml.WriteStartElement("aventura");
            mixml.WriteElementString("nombre", this.Nombre);
            mixml.WriteElementString("desc", this.Descripcion);
            mixml.WriteElementString("master", this.Master);
            mixml.WriteStartElement("personajes");
            for (int i = 0; i < this.ListaPersonajes.Count; i++)
            {
                this.ListaPersonajes[i].toXTVL(mixml);
            }
            mixml.WriteEndElement();

            mixml.WriteStartElement("situaciones");
            for (int i = 0; i < this.ListaSituaciones.Count; i++)
            {
                this.ListaSituaciones[i].toXTVL(mixml);
            }
            mixml.WriteEndElement();

            mixml.WriteEndElement();
        }

        public bool guardar(string ruta)
        {
            XmlTextWriter mixml = new XmlTextWriter(ruta, System.Text.Encoding.UTF8);
            mixml.Formatting = System.Xml.Formatting.Indented;
            mixml.WriteStartDocument();
            this.toXTVL(mixml);
            mixml.WriteEndDocument();
            mixml.Close();
            XSDValidator validador = new XSDValidator(_rutaxsd, ruta);
            if (validador.validar())
            {
                return true;
            }
            else
            {
                if (System.IO.File.Exists(ruta))
                {
                    System.IO.File.Delete(ruta);
                }
                return false;
            }
        }

        public bool cargar(string ruta)
        {
            XSDValidator validador = new XSDValidator(_rutaxsd, ruta);
            if (!validador.validar())
            {
                this._fallo = validador.Fallo;
                return false;
            }
            else
            {
                XmlDocument xtvl = new XmlDocument();
                xtvl.Load(ruta);
                XmlNodeList nombre = xtvl.GetElementsByTagName("nombre");
                XmlNodeList desc = xtvl.GetElementsByTagName("desc");
                XmlNodeList master = xtvl.GetElementsByTagName("master");
                XmlNodeList lpers = xtvl.GetElementsByTagName("personaje");
                XmlNodeList lsits = xtvl.GetElementsByTagName("situaciones");

                this.Nombre = nombre[0].InnerText;
                this.Descripcion = desc[0].InnerText;
                this.Master = master[0].InnerText;

                foreach (XmlElement nodo in lpers)
                {
                    if (nodo.GetAttribute("tipo") == "Jugador")
                    {
                        PersonajeL5A npers = new PersonajeL5A(nodo);
                        this.ListaPersonajes.Add(npers);
                    }
                }

                foreach (XmlElement nodo in lsits)
                {
                        SituacionL5A nsit = new SituacionL5A(nodo);
                        this.ListaSituaciones.Add(nsit);
                }
                return true;
            }
        }
    }
}
